package com.cwj.os.coursedesgin.bashor;

import com.cwj.os.coursedesgin.texteditor.TextFileOpener;
import com.sun.source.tree.Tree;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.nio.file.Path;
import java.util.*;
import java.awt.event.KeyListener;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.function.BooleanSupplier;

//  命令行类，统筹这个系统

public class MyBash {

    public static final String ROOT_NAME = "root";//这个当前没有用到，之前是用于测试的

    User user;//当前用户

    FileTree fileTree = new FileTree();//对应文件树


    public MyBash(String username, String pawd) {
        this.user = new User(username, pawd);
    }
//  登录
    public void login(String username, String pawd) {
        this.user = new User(username, pawd);
        this.fileTree.reset();
    }


    public void init() {
        this.fileTree.reset();
    }
//  命令行窗口启动函数
    public void start() {


        String username;
        String pawd;
        Scanner in = new Scanner(System.in);

        System.out.println("用户名：");
        while (!(username = in.nextLine()).equals("quit")) {
            if (!this.fileTree.verifyUser(username, "", false)) {
                showError("用户不存在");
                System.out.println("用户名：");
                continue;
            }
            System.out.println("输入密码:");
            pawd = in.nextLine();
            int count = 0;
            boolean flag = true;
            while (!this.fileTree.verifyUser(username, pawd, true)) {
                showError("密码错误！请重新输入：");
                pawd = in.nextLine();
                count++;
                if (count >= 3) flag = false;
            }

            if (!flag) continue;

            this.user.setPawd(pawd);this.user.setUsername(username);

            if(!this.fileTree.replacePersonHomeNode(username)){
                showError("权限系统异常");
                System.exit(0);
            }

            String order;

            show();
            while (!(order = in.nextLine()).equals("quit")) {
                process(order);
                show();
            }

            this.fileTree.endDo();

            System.out.println("用户名:");

        }

        System.exit(0);

    }
//    命令处理函数
    public void process(String order) {

        if (order.trim().equals("")) return;

        final String[] list = order.trim().split(" ");
        List<String> nums = Arrays.asList(list);
        int len = nums.size();
        String str = list[0];
        if ("ls".equals(str)) {
            if (list.length < 2) this.fileTree.showSub(false);
            else if (Arrays.asList(list).contains("-l")) {
                this.fileTree.showSub(true);
            }
            return;
        } else if ("quit".equals(str)) {
            System.exit(0);
        }else if("pwd".equals(str)){
            System.out.println(this.fileTree.getFaPath());
            return ;
        }else if("help".equals(str)){
            this.showTow();
            return ;
        }
        if (list.length < 2) {
            showError("指令错误 （help指令查看命令文档）");
            return;
        }
        if ("mkdir".equals(str)) {
            if (!this.fileTree.addDir(list[1], false)) {
                System.out.println("是否覆盖同名目录?(Y/N)");
                String cc = new Scanner(System.in).next();
                if (cc.trim().equals("Y")) {
                    this.fileTree.addDir(list[1], true);
                } else {
                    int count = 1;
                    while (!this.fileTree.addDir(list[1] + "(" + count + ")", true)) count++;
                }

            }
        } else if ("touch".equals(str)) {

            int count = 0;

            if (fileTree.getNowNode().getFiles().find(list[1]) != null) {
                System.out.println("是否覆盖同名文件？（Y/N）");
                String cc = new Scanner(System.in).next();
                if (cc.equals("N")) {
                    while (fileTree.getNowNode().getFiles().find(list[1] + "(" + count + ")") != null) count++;
                    list[1] += "(" + count + ")";
                }

            }

            this.fileTree.addFile(list[1], this.getProCode(nums), true);


        } else if ("cd".equals(str)) {
            if (list.length != 2) {
                showError(null);
                return;
            }

            String s = list[1];

            if (s.equals("..") || s.equals("../")) {
                this.fileTree.cdPre();
            }else if(s.equals("~")){
                this.fileTree.replacePersonHomeNode(this.user.getUsername());
            }
            else if(!(s.equals(".") || s.equals("./"))){
                if (!this.fileTree.cdDir(list[1])) {
                    showError("没有对于的子目录");
                }
            }
        } else if ("rm".equals(str)) {

            if (list.length == 2)
                this.fileTree.removeFile(list[1]);//this.fileTree.getNowNode().getFiles().remove(list[1]);
            if (list.length >= 3 && nums.contains("-d")) {
                if (nums.contains("-r")) this.fileTree.removeDir(list[1], true);
                else this.fileTree.removeDir(list[1], false);
            }
        } else if ("vim".equals(str)) {

            final ProCode proCode = this.fileTree.getNowNode().getProCodeList().get(list[1]);
            if (proCode != null) {
                String wc = proCode.writeCode;
                if (wc != null && !wc.equals("")) {
                    System.out.println("请输入文件保护码: ");
                    if (!new Scanner(System.in).next().equals(wc)) {
                        showError("保护码错误");
                        return;
                    }
                }
            }

            this.fileTree.addFile(list[1], proCode == null ? this.getProCode(nums) : proCode, true);

            TextFileOpener frame = new TextFileOpener(Path.of(this.fileTree.getFaPath(), list[1]).toString());
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        } else if ("cat".equals(str)) {

            final ProCode proCode = this.fileTree.getNowNode().getProCodeList().get(list[1]);
            if (proCode != null) {
                String rc = proCode.readCode;
                if (rc != null && !rc.equals("")) {
                    System.out.println("请输入文件保护码: ");
                    if (!new Scanner(System.in).next().equals(rc)) {
                        showError("保护码错误");
                        return;
                    }
                }
            }

            this.fileTree.showFileContext(list[1]);
        }else {
            showError("没有该指令 （help指令查看命令文档）");
        }
    }

//    获取保护码
    public ProCode getProCode(List<String> nums) {

        int len = nums.size();

        int wv = nums.indexOf("-w");
        int rv = nums.indexOf("-r");
        String wCode = wv > 0 && wv < len - 1 ? nums.get(wv + 1) : "";
        String rCode = rv > 0 && rv < len - 1 ? nums.get(rv + 1) : "";

//        if(wCode.charAt(0) == '-' || rCode.charAt(0) == '-') return null;

        return new ProCode(rCode, wCode);
    }

//  错误显示函数
    public void showError(String str) {
        String defaultStr = "指令错误 （help命令查看命令文档）";

        //使用Date创建日期对象
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        if (str == null) str = defaultStr;
        System.out.println("***  error:" + str + "   " + format.format(date) + "   ***");

    }

    public void showTow(){

        showItem("ls  列文件 -l 列文件的详细信息（包括隐藏文件）");
        showItem("pwd  列出决定文件");
        showItem("mkdir 新建文件 ");
        showItem("rm  删除文件 -d 删除空文件夹 -r 删除非空文件夹（在-d参数的基础上才起作用）");
        showItem("touch 新建文件 -w 设置文件写权限保护码 -r 设置文件读权限保护码");
        showItem("cd 进入子目录 其中 cd ~ 为进入家目录 cd .. 进入父目录 ");
        showItem("vim 编辑文件（如果没有文件就会新建文件）");
        showItem("cat 显示文件的内容");
        showItem("help 显示帮助菜单");

    }

    public void showItem(String str ){
        System.out.println("***      "+str+"    ***");
    }

    public void show() {
        System.out.println(user.getUsername() + ":" + fileTree.getPath() + "$");
    }
}
